package cclab.example.testapp;

import java.util.Set;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;;

public class DeviceListActivity extends Activity{
	
	//Debugging	
	private static final String TAG = "DeviceListActivity";
	private static final boolean D = true;

	//Return Intent extra
	public static String EXTRA_DEVICE_ADDRESS = "device_address";
	
	//Member fields
	private BluetoothAdapter mBtAdapter;
	private ArrayAdapter<String> mPairedDevicesArrayAdapter;
	private ArrayAdapter<String> mNewDevicesArrayAdapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
	
		//Setup the window
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		setContentView(R.layout.activity_devicelist);

		//Set result CANCELED incase the user backs out
		setResult(Activity.RESULT_CANCELED);

		//Initialize the button to perform device discovery
		Button scanButton = (Button)findViewById(R.id.Scan_Button);
		scanButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				doDiscovery();
				v.setVisibility(View.GONE);
			}
		});
		
		//One Adapter paired,the other unpaired
		mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
		mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
		
		//Put paired device into ListView
		ListView pairedListView = (ListView)findViewById(R.id.paired_devices);
		pairedListView.setAdapter(mPairedDevicesArrayAdapter);
		pairedListView.setOnItemClickListener(mDeviceClickListener);
		
		//Put new device into ListView
		ListView newDeviceListView = (ListView)findViewById(R.id.new_devices);
		newDeviceListView.setAdapter(mNewDevicesArrayAdapter);
		newDeviceListView.setOnItemClickListener(mDeviceClickListener);
		
		//Rigister for broadcasts when a device is discovered
		IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
		this.registerReceiver(mReceiver, filter);
		
		//Rigister for broadcasts when discovery has finished
		filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
		this.registerReceiver(mReceiver, filter);
		
		//Get local Bluetooth adapter
		mBtAdapter = BluetoothAdapter.getDefaultAdapter();

		//Get a set of currently paired devices
		Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
		
		// If there are paired devices, add each one to the ArrayAdapter
		if (pairedDevices.size() > 0) {
			findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
			for (BluetoothDevice device : pairedDevices) {
				mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());
			}
		} else {
			String noDevices = getResources().getText(R.string.none_paired).toString();
			mPairedDevicesArrayAdapter.add(noDevices);
		}
		}
		@Override
		protected void onDestroy() {
			super.onDestroy();

			// Make sure we're not doing discovery anymore
			if (mBtAdapter != null) {
				mBtAdapter.cancelDiscovery();
			}

			// Unregister broadcast listeners
			this.unregisterReceiver(mReceiver);
		}

		/**
		* Start device discover with the BluetoothAdapter
		*/
		private void doDiscovery() {
			if (D) Log.d(TAG, "doDiscovery()");

			// Indicate scanning in the title
			setProgressBarIndeterminateVisibility(true);
			setTitle(R.string.scanning);

			// Turn on sub-title for new devices
			findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);
	
			// If we're already discovering, stop it
			if (mBtAdapter.isDiscovering()) {
				mBtAdapter.cancelDiscovery();
			}

		// Request discover from BluetoothAdapter
		mBtAdapter.startDiscovery();
		}

		// The on-click listener for all devices in the ListViews
		private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
			public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
			// Cancel discovery,choose a device to connect
			mBtAdapter.cancelDiscovery();
	
			// Get device MAC
			String info = ((TextView) v).getText().toString();
			String address = info.substring(info.length() - 17);
	
			// Send MAC to main Activity
			Intent intent = new Intent();
			intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
	
			// Finish current activity
			setResult(Activity.RESULT_OK, intent);
			finish();
			}
		};

		//When BroadcastReceiver find device reset TITLE
		private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
		@Override
			public void onReceive(Context context, Intent intent) {
				String action = intent.getAction();
		
				// When discovery finds a device
				if (BluetoothDevice.ACTION_FOUND.equals(action)) {
					// Get the BluetoothDevice object from the Intent
					BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
					// If it's already paired, skip it, because it's been listed already
					if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
						mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());
				}
				//When discovery is finished,change the Activity title
				}
				else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
					setProgressBarIndeterminateVisibility(false);
					setTitle(R.string.select_device);
					if(mNewDevicesArrayAdapter.getCount()==0){
						String noDevice = getResources().getText(R.string.none_found).toString();
						mNewDevicesArrayAdapter.add(noDevice);
					}
				}
			}
		};
}